Shared Memory হল একটি ইন্টার-প্রসেস কমিউনিকেশন (IPC) পদ্ধতি যা একাধিক প্রক্রিয়ার মধ্যে দ্রুত এবং কার্যকরীভাবে তথ্য শেয়ার করার জন্য ব্যবহৃত হয়। এটি বিভিন্ন প্রক্রিয়া একই মেমরি সেগমেন্টে ডেটা পড়া এবং লেখা করতে সক্ষম করে, যা যোগাযোগের একটি দ্রুত উপায় প্রদান করে। নিচে Shared Memory এর মাধ্যমে প্রক্রিয়াগুলোর মধ্যে ডেটা শেয়ার করার প্রক্রিয়া এবং উদাহরণ আলোচনা করা হলো।
Shared Memory এর মাধ্যমে ডেটা শেয়ার করার প্রক্রিয়া
১. Shared Memory Segment তৈরি করা:
- প্রথমত, একটি Shared Memory Segment তৈরি করতে
shmget()ফাংশন ব্যবহার করা হয়। এটি একটি নির্দিষ্ট কী এবং সেমাফোরের সংখ্যা নির্দেশ করে।
২. Shared Memory Attach করা:
- সেমাফোর আইডি পেয়ে গেলে,
shmat()ফাংশন ব্যবহার করে শেয়ার্ড মেমরি সেগমেন্টটি প্রক্রিয়ার মধ্যে সংযুক্ত করা হয়। এটি একটি পয়েন্টার ফেরত দেয় যা শেয়ার্ড মেমরির অবস্থান নির্দেশ করে।
৩. ডেটা লেখা এবং পড়া:
- এক বা একাধিক প্রক্রিয়া শেয়ার্ড মেমরিতে ডেটা লেখে এবং পড়ে। একটি প্রক্রিয়া ডেটা লিখে এবং অন্য প্রক্রিয়া সেই ডেটা পড়ে।
৪. Shared Memory Detach করা:
- কাজ শেষে,
shmdt()ফাংশন ব্যবহার করে শেয়ার্ড মেমরি সেগমেন্ট থেকে বিচ্ছিন্ন করা হয়।
৫. Shared Memory Cleanup:
- অবশেষে, যদি প্রয়োজন হয়,
shmctl()ফাংশন ব্যবহার করে শেয়ার্ড মেমরি সেগমেন্ট মুছে ফেলা হয়।
উদাহরণ
নিচে একটি উদাহরণ দেওয়া হলো যেখানে দুটি প্রক্রিয়া একটি শেয়ার্ড মেমরি সেগমেন্ট ব্যবহার করে:
Producer-Consumer Model
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#define SHM_SIZE 1024 // Shared memory size
int main() {
int shmid;
key_t key = ftok("shmfile", 65); // Create a unique key
// Create shared memory
shmid = shmget(key, SHM_SIZE, 0666 | IPC_CREAT);
// Attach to shared memory
char *str = (char *)shmat(shmid, NULL, 0);
if (fork() == 0) {
// Child process (Producer)
sprintf(str, "Hello from producer!");
printf("Producer wrote: %s\n", str);
} else {
// Parent process (Consumer)
wait(NULL); // Wait for the child process to finish
printf("Consumer read: %s\n", str);
// Detach from shared memory
shmdt(str);
// Destroy the shared memory
shmctl(shmid, IPC_RMID, NULL);
}
return 0;
}
কোডের ব্যাখ্যা
- শেয়ার্ড মেমরি তৈরি:
shmget()ফাংশন দ্বারা একটি শেয়ার্ড মেমরি সেগমেন্ট তৈরি করা হয় এবং তার জন্য একটি কী উৎপন্ন করা হয়। - অ্যাটাচ করা:
shmat()ফাংশন দ্বারা শেয়ার্ড মেমরি সেগমেন্টে অ্যাক্সেস করা হয়। - প্রোডিউসার: চাইল্ড প্রক্রিয়া শেয়ার্ড মেমরিতে একটি বার্তা লেখে।
- কনজিউমার: প্যারেন্ট প্রক্রিয়া (কনজিউমার) শেয়ার্ড মেমরি থেকে বার্তা পড়ে।
- ডিটাচ ও ক্লিনআপ: প্রক্রিয়া শেষ হলে শেয়ার্ড মেমরি থেকে বিচ্ছিন্ন হয়ে, মেমরিটি পরিষ্কার করা হয়।
সুবিধা এবং অসুবিধা
সুবিধা:
- দ্রুত যোগাযোগ: Shared Memory প্রক্রিয়াগুলির মধ্যে দ্রুত তথ্য আদান-প্রদান করে, কারণ এটি সরাসরি মেমরিতে কাজ করে।
- কম ওভারহেড: অন্যান্য IPC পদ্ধতির তুলনায় Shared Memory ব্যবহারের সময় কম ওভারহেড হয়।
অসুবিধা:
- সিঙ্ক্রোনাইজেশন সমস্যা: একাধিক প্রক্রিয়া যদি একই সময়ে শেয়ার্ড মেমরির উপর কাজ করে, তবে কনসিস্টেন্সি সমস্যা সৃষ্টি হতে পারে।
- জটিলতা: সঠিক সিঙ্ক্রোনাইজেশন নিশ্চিত করা প্রায়ই জটিল হতে পারে।
উপসংহার
Shared Memory প্রক্রিয়াগুলির মধ্যে দ্রুত এবং কার্যকরী তথ্য শেয়ার করার একটি শক্তিশালী পদ্ধতি। সঠিকভাবে ব্যবহৃত হলে, এটি সিস্টেমের কার্যকারিতা এবং পারফরম্যান্স বৃদ্ধি করে। তবে, সিঙ্ক্রোনাইজেশন এবং মেমরি ব্যবস্থাপনার বিষয়গুলি অবশ্যই খেয়াল রাখতে হবে।
Read more